﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation;

namespace Sinacor.Servico.Bovespa.Ordens.BusinessLogic
{
    public class Motivo : BaseBusinessLogic
    {

        #region Construtor

        public Motivo()
            : base()
        { }

        #endregion

        #region Constantes de Erro
       
        private const int MOTIVO_INCLUIRMOTIVO_NULO = 109032;
        private const int CODIGO_MOTIVO_INCLUIRMOTIVO_DUPLICADO = 109047;
        private const int DESCRICAO_MOTIVO_DUPLICADO =109048;
        private const int MOTIVO_ALTERAMOTIVO_NULO = 109049;
        private const int FILTROMOTIVO_CONSULTAMOTIVO_NULO = 109050;
        private const int FILTROMOTIVO_EXCLUIRMOTIVO_NULO = 109051;

        #endregion 

        #region Metodos Publicos

        public List<BusinessEntity.Motivo> ConsultarMotivos(BusinessEntity.Parameter.FiltroMotivo parameter)
        {
            ResourceAccess.Motivo raMotivo;
            List<BusinessEntity.Motivo> response;

            if (parameter == null)
                throw new BusinessException(FILTROMOTIVO_CONSULTAMOTIVO_NULO);
            else
            {
                raMotivo = new Sinacor.Servico.Bovespa.Ordens.ResourceAccess.Motivo();
                response = new List<Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Motivo>();
                response = raMotivo.ConsultarMotivos(parameter);
            }

            return response;
        }

        public void AlterarMotivo(BusinessEntity.Motivo entity)
        {
            ResourceAccess.Motivo raMotivo;

            if (entity == null)
                throw new BusinessException(MOTIVO_ALTERAMOTIVO_NULO);
            
            this.ValidarMotivoAlteracao(entity);

            if (!ValidarExistenciaDescricaoMotivo(entity.Descricao))
                throw new BusinessException(DESCRICAO_MOTIVO_DUPLICADO);

            raMotivo = new Sinacor.Servico.Bovespa.Ordens.ResourceAccess.Motivo();
            
            raMotivo.AlteraraMotivo(entity);

        }

        public void AlterarMotivos(List<BusinessEntity.Motivo> entityList)
        {
            foreach (BusinessEntity.Motivo item in entityList)
            {
                AlterarMotivo(item);
            }
        }

        public void ExcluirMotivo(BusinessEntity.Parameter.FiltroMotivo parameter)
        {
            ResourceAccess.Motivo raMotivo;
            if (parameter == null)
                throw new BusinessException(FILTROMOTIVO_EXCLUIRMOTIVO_NULO);
            else
            {
                raMotivo = new Sinacor.Servico.Bovespa.Ordens.ResourceAccess.Motivo();
                raMotivo.ExcluirMotivo(parameter);
            }
        }

        public void ExcluirMotivos(List<BusinessEntity.Parameter.FiltroMotivo> parameterList)
        {
            foreach (BusinessEntity.Parameter.FiltroMotivo item in parameterList)
            {
                ExcluirMotivo(item);
            }
        }

        public void IncluirMotivo(BusinessEntity.Motivo entity)
        {
            ResourceAccess.Motivo raMotivo;

            if (entity == null)
                throw new BusinessException(MOTIVO_INCLUIRMOTIVO_NULO);

            ValidarMotivoInclusao(entity);

            if (!ValidarExistenciaCodigoMotivo(entity.Codigo.Value))
                throw new BusinessException(CODIGO_MOTIVO_INCLUIRMOTIVO_DUPLICADO);

            if (!ValidarExistenciaDescricaoMotivo(entity.Descricao))
                throw new BusinessException(DESCRICAO_MOTIVO_DUPLICADO);

            raMotivo = new Sinacor.Servico.Bovespa.Ordens.ResourceAccess.Motivo();

            raMotivo.IncluirMotivo(entity);
        }

        public void IncluirMotivos(List<BusinessEntity.Motivo> entityList)
        {
            foreach (BusinessEntity.Motivo item in entityList)
            {
                IncluirMotivo(item);
            }
        }

        public void ExecutarTransacoes(List<BusinessEntity.Motivo> inclusaoList, List<BusinessEntity.Parameter.FiltroMotivo> exclusaoList, List<BusinessEntity.Motivo> alteracaoList)
        {
            IncluirMotivos(inclusaoList);
            ExcluirMotivos(exclusaoList);
            AlterarMotivos(alteracaoList);
        }

        #endregion

        #region Metodos Privados

        private bool ValidarExistenciaCodigoMotivo(int codigo)
        {
            BusinessEntity.Parameter.FiltroMotivo filtroMotivo = new Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Parameter.FiltroMotivo();
            filtroMotivo.Codigo = codigo;

            if (ConsultarMotivos(filtroMotivo).Count > 0)
                return false;
            else
                return true;
        }

        private bool ValidarExistenciaDescricaoMotivo(string descricao)
        {
            BusinessEntity.Parameter.FiltroMotivo filtroMotivo = new Sinacor.Servico.Bovespa.Ordens.BusinessEntity.Parameter.FiltroMotivo();
            filtroMotivo.Descricao = descricao;

            if (ConsultarMotivos(filtroMotivo).Count > 0)
                return false;
            else
                return true;
        }

        private void ValidarMotivoInclusao(BusinessEntity.Motivo entity)
        {

            #region validacao

            SinacorValidation validation = new SinacorValidation();

            validation.Validate<BusinessEntity.Motivo>(entity, "Inclusao");

            validation.Validate();

            validation = null;
           

            #endregion
        }

        private void ValidarMotivoAlteracao(BusinessEntity.Motivo entity)
        {

            #region validacao
            
            SinacorValidation validation = new SinacorValidation();

            validation.Validate<BusinessEntity.Motivo>(entity, "Alteracao");

            validation.Validate();

            validation = null;


            #endregion
        }

        #endregion

    }
}
